package com.alex.alexelasticsearch.repository;


import com.alex.alexelasticsearch.model.Alex008Product;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
import java.math.BigDecimal;
import java.util.List;

/**
 * 商品搜索 Repository
 * ElasticsearchRepository 提供了基础的 CRUD 操作
 * 我们可以通过方法命名规则定义查询，也可以使用 @Query 注解自定义查询
 */
@Repository
public interface Alex008ProductRepository extends ElasticsearchRepository<Alex008Product, String> {
    
    /**
     * 根据商品名称搜索（模糊搜索）
     * Spring Data ES 会自动根据方法名生成查询
     */
    List<Alex008Product> findByProductNameContaining(String productName);
    
    /**
     * 根据品牌精确查询
     */
    List<Alex008Product> findByBrand(String brand);
    
    /**
     * 根据分类查询
     */
    List<Alex008Product> findByCategory(String category);
    
    /**
     * 价格区间查询
     */
    List<Alex008Product> findByPriceBetween(BigDecimal minPrice, BigDecimal maxPrice);
    
    /**
     * 根据评分范围查询，并按销量降序排序
     */
    List<Alex008Product> findByRatingGreaterThanEqualOrderBySalesCountDesc(Double rating);
    
    /**
     * 复合查询：商品名称包含关键词 AND 分类匹配 AND 价格区间
     */
    Page<Alex008Product> findByProductNameContainingAndCategoryAndPriceBetween(
            String productName, String category, BigDecimal minPrice, BigDecimal maxPrice, Pageable pageable);
    
    /**
     * 自定义查询：使用 ES 的 Query DSL
     * 这个查询实现了多字段搜索，在商品名称和描述中搜索关键词
     */
    @Query("""
        {
          "bool": {
            "should": [
              {
                "match": {
                  "productName": {
                    "query": "?0",
                    "boost": 2.0
                  }
                }
              },
              {
                "match": {
                  "description": {
                    "query": "?0"
                  }
                }
              }
            ],
            "minimum_should_match": 1
          }
        }
        """)
    List<Alex008Product> searchByKeyword(String keyword);
}